package com.tangxz.chat.modules.netty;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;

/**
 * @author: 唐小尊
 * @email: 1171702529@qq.com
 * @cate: 2021/04/17 16:22
 */
public class WSServerInitialzer extends ChannelInitializer<SocketChannel> {
    @Override
    protected void initChannel(SocketChannel channel) throws Exception {
        //获取管道（pipeline）
        ChannelPipeline pipeline = channel.pipeline();
        //websocket 基于http协议，所需要的http 编解码器
        pipeline.addLast(new HttpServerCodec());
        //在http上有一些数据流产生，有大有小，我们对其进行处理，既然如此。
        //我们需要使用netty 对大数据流写提供支持，这个类叫：ChunkedWriteHandler
        pipeline.addLast(new ChunkedWriteHandler());

        //对httpMessage 进行聚合处理，聚合成request或response
        //Http对象聚合器,聚合成httpRequest或则httpResponse
        pipeline.addLast(new HttpObjectAggregator(1024*64));
        //Web套接字服务器协议处理程序
        //处理某个websocket路由地址
        /**
         * 处理一些繁重复杂的事情
         * 会帮你处理握手动作：handshaking（close、ping、pong）
         * ping+pong = 心跳
         * 对于websocket来讲，都是以frams 进行传输的，不同的数据类型对应的frams 也不同
         */
        pipeline.addLast(new WebSocketServerProtocolHandler("/chat-netty"));

        //自定义的handler
        pipeline.addLast(new ChatHandler());

        System.out.println("初始化");


    }



}
